// 观察者

class Watcher {
    /**
     * 创建一个观察者，并为这个观察者添加一个观察的目标对象。
     * @param {Vue} vm  当前 vue 的实例
     * @param {string} key 当前需要观察的属性名
     * @param {(newValue: any) => void} cb  当属性修改的时候，会执行的回调
     */
    constructor(vm, key,cb){
       this.vm = vm;
       this.cb = cb;
       this.key = key;
       Dep.target = this;
       // 当执行 vm[key] 时会触发 getter 方法，对应的 在 Observer 中对 Dep.target 进行了收集
       this.oldValue = vm[key]; 
       Dep.target = null; // 将全局的目标进行重置，避免重复添加
    }
    // 当 目标对象发生修改时，就会发送更新通知，这个时候就可以执行 更新操作了，如果数据未发生变化，则不做处理。
    update() {
      const newValue = this.vm[this.key];
      if(this.oldValue === newValue){
          return
      }   
      this.cb(newValue);
    }
}